//==============================================
//file info//===================================
//file   :test_paillier_gmp.h
//author :王晓晨 HUST beamworld.gitee.io
//date   :2023.05.28
//change :
//   1)完成paillier密钥生成和加解密 2023.05.28
//=============================================
#ifndef __TEST_PAILLIER_GMP__
#define __TEST_PAILLIER_GMP__

//==============================================
//library//=====================================
#include <gmp.h>
//==============================================

//==============================================
//struct//======================================
//公钥结构体
typedef struct 
{
	int bits;	// 位数
	mpz_t n;  	// n
	mpz_t hs; 	// hs
	mpz_t n_square; // n^2
} paillier_pubkey;

//私钥结构体
typedef struct 
{
	int bits;	// 位数
	mpz_t lambda;  // lambda
	mpz_t mu;  // mu
} paillier_prikey;

//密钥结构体
typedef struct 
{
	paillier_pubkey* pubkey;	//公钥
	paillier_prikey* prikey;	//私钥
	int bits;	//位数
} paillier_keypair;
//==============================================

//==============================================
//declare//=====================================
/*
 * [函数名称] paillier_keypair_free
 * [功能描述] 释放密钥结构体
 * [参数描述] keypair 要释放的密钥结构体指针
 * [ 返回值 ] void
 */
void paillier_keypair_free(paillier_keypair* keypair);

/*
 * [函数名称] paillier_keypair_new
 * [功能描述] 生成新的密钥结构体
 * [参数描述] NULL
 * [ 返回值 ] paillier_keypair* paillier密钥结构体指针
 */
paillier_keypair* paillier_keypair_new();

//paillier密钥生成，加解密部分--------------------
/*
 * [函数名称] generate_keypair
 * [功能描述] 生成密钥
 * [参数描述] p_kp 密钥结构体
 *			 bits 密钥位数
 * [ 返回值 ] void	
 */
void generate_keypair(paillier_keypair* pk, int bits);

/*
 * [函数名称] generate_urandomm
 * [功能描述] 生成0 ~ n - 1的随机无符整数
 * [参数描述] rop 随机数结果
 *			 n 随机数上限
 * [ 返回值 ] void	
 */
void generate_urandomm(mpz_t rop, mpz_t  n);

/*
 * [函数名称] generate_urandomb
 * [功能描述] 生成介于 0 到 2^k（k 为正整数）之间的随机无符整数
 * [参数描述] rop 随机数结果
 *			 k 随机数上限
 * [ 返回值 ] void	
 */
void generate_urandomb(mpz_t rop, mp_bitcnt_t k);

/*
 * [函数名称] encrypt
 * [功能描述] 加密明文
 * [参数描述] pubkey 公钥结构体
 *			 out 密文
 *			 m 明文
 * [ 返回值 ] 1 密钥位数不正确 
 * 			 0 正常
 */
void encrypt(mpz_t out, paillier_pubkey* pubkey, mpz_t m);

/*
 * [函数名称] decrypt
 * [功能描述] 解密密文
 * [参数描述] p_kp 密钥结构体
 *			 out 明文
 *			 c 密文
 * [ 返回值 ] void
 */
void decrypt(mpz_t out, paillier_keypair* pk, mpz_t c);
//==============================================

#endif
